﻿using System;
using System.Runtime.Serialization;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Working.Domínio
{
    [Serializable]
    public class CarteiraDeIdentidade: IDocumentoIdentificação, ISerializable
    {
        private Pessoa pessoa;


        public CarteiraDeIdentidade(Pessoa pessoa, string registroGeral)
        {
            if(pessoa == null)
                throw new ArgumentException("Parâmetro 'pessoa' não pode ser nulo.");

            if(string.IsNullOrEmpty(registroGeral))
                throw new ArgumentException("Parâmetro 'registroGeral' não pode ser branco ou nulo.");

            this.pessoa = pessoa;
            this.registroGeral = registroGeral;
        }

        protected CarteiraDeIdentidade(SerializationInfo info, StreamingContext context)
        {
            //TODO: Caso pessoa não esteja no cache, deverá ser procurada
            //no adaptador de Pessoa (IPessoaDataAdapter)
            //IPessoaDataAdapter adapter = FactoryDataAdapter<Pessoa>.CreateDataAdapter();
            //this.pessoa = adapter.Obtém(oid);
            //Atenção! Estudar viabilidade da implementação já que CarteiraDeTrabalho
            //não tem responsabilidade por buscar tais informações. Nesse caso, buscar apenas 
            //objetos do cache de entidades
            int oid = info.GetInt32("Pessoa");
            this.pessoa = Domínio.Instância.ObterEntidadeDoCache<Pessoa>(oid);
            this.registroGeral = info.GetString("RegistroGeral");
            this.dataDeExpedição = info.GetDateTime("DataDeExpedição");
            this.orgãoEmissor = info.GetString("OrgãoEmissor");
            this.unidadeFederativa = info.GetString("UnidadeFederativa");
        }

        public string RegistroGeral
        {
            get { return registroGeral; }
        }
        private string registroGeral;        

        public DateTime DataDeExpedição
        {
            get { return dataDeExpedição; }
            set { dataDeExpedição = value; }
        }
        private DateTime dataDeExpedição = DateTime.MinValue;

        public string OrgãoEmissor
        {
            get { return orgãoEmissor; }
            set { orgãoEmissor = value; }
        }
        private string orgãoEmissor = string.Empty;

        public string UnidadeFederativa
        {
            get { return unidadeFederativa; }
            set { unidadeFederativa = value; }
        }
        private string unidadeFederativa = string.Empty;

        public string Nome
        {
            get { return this.pessoa.Nome; }
        }

        public DateTime DataDeNascimento
        {
            get { return this.pessoa.DataDeNascimento; }
        }

        public string NomeMãe
        {
            get { return this.pessoa.NomeDaMãe; }
        }

        public string NomePai
        {
            get { return this.pessoa.NomeDoPai; }
        }

        public string Naturalidade
        {
            get 
            {
                if(this.pessoa.Naturalidade != null)
                    return this.pessoa.Naturalidade.ToString();
                else
                    return string.Empty;
            }
        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            //TODO: Estudar melhor forma para buscar objeto pessoa,
            //evitando que exista duas instâncias identicas carregadas
            info.AddValue("Pessoa", this.pessoa.OID);
            info.AddValue("RegistroGeral", this.RegistroGeral);
            info.AddValue("DataDeExpedição", this.DataDeExpedição);
            info.AddValue("OrgãoEmissor", this.OrgãoEmissor);
            info.AddValue("UnidadeFederativa", this.UnidadeFederativa);
        }
    }
}
